package com.freeheart.validation.constraints;

import com.freeheart.validation.constraintvalidators.in.CompositionInConstraintValidator;
import com.freeheart.validation.constraintvalidators.in.InCollection;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 判断一个属性是否在某个集合内的校验注解
 */
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {CompositionInConstraintValidator.class})
public @interface In {

    /**
     * 提供校验集合的InCollection子类的Class。
     *
     * @return Class<? extends InCollection>
     */
    Class<? extends InCollection> value();

    /**
     * 校验失败后的描述信息：{e}表示对校验失败值，如果是Object会做toString处理。
     *
     * @return 校验失败后的描述信息
     */
    String message() default "元素{e}不合法";

    /**
     * 分组
     * @return Class<?>[]
     */
    Class<?>[] groups() default {};

    /**
     * 提供元信息
     * @return Class<? extends Payload>[]
     */
    Class<? extends Payload>[] payload() default {};

}
